home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / Onboard / settings.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  13.2 KB  |  325 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import gtk
  5. import gtk.glade as gtk
  6. import gconf
  7. import gobject
  8. from virtkey import virtkey
  9. from Onboard.OnboardGtk import OnboardGtk
  10. import shutil
  11. import utils
  12. from utils import get_install_dir
  13. from xml.parsers.expat import ExpatError
  14. from xml.dom import minidom
  15. import os
  16. import os.path as os
  17. import gettext
  18. from gettext import gettext as _
  19. app = 'onboard-settings'
  20. gettext.textdomain(app)
  21. gettext.bindtextdomain(app)
  22. gtk.glade.textdomain(app)
  23. gtk.glade.bindtextdomain(app)
  24.  
  25. class Settings:
  26.     
  27.     def __init__(self, mainwin):
  28.         self.SOK_INSTALL_DIR = get_install_dir()
  29.         if not self.SOK_INSTALL_DIR:
  30.             print 'Onboard not installed properly'
  31.             return None
  32.         self.gladeXML = gtk.glade.XML(os.path.join(self.SOK_INSTALL_DIR, 'data', 'settings.glade'))
  33.         self.window = self.gladeXML.get_widget('settingsWindow')
  34.         self.gladeXML.signal_autoconnect({
  35.             'on_layoutView_released': self.do_change_layout,
  36.             'on_addButton_clicked': self.add_sok,
  37.             'on_removeButton_clicked': self.cb_removeButton_clicked,
  38.             'on_macroAddButton_clicked': self.add_macro,
  39.             'on_closeButton_clicked': self.cb_closeButton_clicked,
  40.             'on_intervalSpin_value_changed': self.cb_intervalSpin_value_changed,
  41.             'on_scanningCheck_toggled': self.cb_scanningCheck_toggled,
  42.             'on_closeButton_clicked': gtk.main_quit,
  43.             'on_personaliseButton_clicked': self.cb_on_personaliseButton_clicked,
  44.             'on_layoutFolderButton_clicked': self.cb_layoutFolderButton_clicked,
  45.             'on_icon_toggled': self.cb_icon_toggled })
  46.         self.layoutView = self.gladeXML.get_widget('layoutView')
  47.         self.macroNumberBox = self.gladeXML.get_widget('macroNumberBox')
  48.         self.macroTextBox = self.gladeXML.get_widget('macroTextBox')
  49.         self.macroDeleteBox = self.gladeXML.get_widget('macroDeleteBox')
  50.         self.gconfClient = gconf.client_get_default()
  51.         self.layoutView.append_column(gtk.TreeViewColumn(None, gtk.CellRendererText(), markup = 0))
  52.         self.user_layout_root = '%s/.sok/layouts/' % os.path.expanduser('~')
  53.         if not os.path.exists(self.user_layout_root):
  54.             os.makedirs(self.user_layout_root)
  55.         
  56.         self.update_layoutList()
  57.         self.on_macros_changed()
  58.         self.gladeXML.get_widget('icon_toggle').set_active(self.gconfClient.get_bool('/apps/sok/trayicon'))
  59.         scanEnabled = self.gconfClient.get_bool('/apps/sok/scanning')
  60.         if scanEnabled:
  61.             self.gladeXML.get_widget('scanningCheck').set_active(True)
  62.         
  63.         scanInterval = self.gconfClient.get_int('/apps/sok/scanning_interval')
  64.         if scanInterval:
  65.             self.gladeXML.get_widget('intervalSpin').set_value(float(scanInterval) / 1000)
  66.         
  67.         self.window.show()
  68.         self.window.set_keep_above(not mainwin)
  69.         self.window.connect('destroy', gtk.main_quit)
  70.         gtk.main()
  71.  
  72.     
  73.     def on_macros_changed(self, client = None, cxion_id = None, entry = None, user_data = None):
  74.         tempMacroList = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  75.         self.macroNumbers = []
  76.         for child in self.macroNumberBox.get_children():
  77.             if child.__class__ is gtk.Entry:
  78.                 self.macroNumberBox.remove(child)
  79.                 continue
  80.         
  81.         for child in self.macroTextBox.get_children():
  82.             if child.__class__ is gtk.Entry:
  83.                 self.macroTextBox.remove(child)
  84.                 continue
  85.         
  86.         for child in self.macroDeleteBox.get_children():
  87.             if child.__class__ is gtk.Button:
  88.                 self.macroDeleteBox.remove(child)
  89.                 continue
  90.         
  91.         for n in range(len(tempMacroList)):
  92.             macroStr = tempMacroList[n]
  93.             if macroStr:
  94.                 self.macroNumbers.append(n)
  95.                 numberEntry = gtk.Entry()
  96.                 numberEntry.set_text(str(n))
  97.                 numberEntry.connect('activate', self.cb_macro_numberEntry_activate, n)
  98.                 numberEntry.set_size_request(5, 30)
  99.                 self.macroNumberBox.pack_start(numberEntry, False, False, 5)
  100.                 numberEntry.show()
  101.                 textEntry = gtk.Entry()
  102.                 textEntry.set_text(macroStr)
  103.                 textEntry.connect('activate', self.cb_macro_textEntry_activate, n)
  104.                 textEntry.set_size_request(-1, 30)
  105.                 self.macroTextBox.pack_start(textEntry, False, False, 5)
  106.                 textEntry.show()
  107.                 deleteButton = gtk.Button(stock = gtk.STOCK_DELETE)
  108.                 deleteButton.connect('clicked', self.cb_macro_deleteButton_clicked, n)
  109.                 self.macroDeleteBox.pack_start(deleteButton, False, False, 5)
  110.                 deleteButton.show()
  111.                 continue
  112.         
  113.  
  114.     
  115.     def cb_macro_numberEntry_activate(self, widget, currentNumber):
  116.         newNo = int(widget.get_text())
  117.         if newNo not in self.macroNumbers:
  118.             li = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  119.             if newNo > len(li) - 1:
  120.                 for n in range(len(li) - newNo - 1):
  121.                     li.append('')
  122.                 
  123.             
  124.             text = li[currentNumber]
  125.             li[currentNumber] = ''
  126.             li[newNo] = text
  127.             self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, li)
  128.             self.on_macros_changed()
  129.         else:
  130.             dialog = gtk.MessageDialog(self.window, type = gtk.MESSAGE_WARNING, buttons = gtk.BUTTONS_OK, message_format = _('Snippet already assigned to this number'))
  131.             dialog.run()
  132.             widget.set_text(str(currentNumber))
  133.             dialog.destroy()
  134.  
  135.     
  136.     def cb_macro_textEntry_activate(self, widget, currentNumber):
  137.         li = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  138.         li[currentNumber] = widget.get_text()
  139.         self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, li)
  140.         self.on_macros_changed()
  141.  
  142.     
  143.     def cb_macro_deleteButton_clicked(self, widget, currentNumber):
  144.         li = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  145.         li[currentNumber] = ''
  146.         self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, li)
  147.         self.on_macros_changed()
  148.  
  149.     
  150.     def cb_icon_toggled(self, widget):
  151.         self.gconfClient.set_bool('/apps/sok/trayicon', widget.get_active())
  152.  
  153.     
  154.     def open_user_layout_dir(self):
  155.         if os.path.exists('/usr/bin/nautilus'):
  156.             os.system('nautilus --no-desktop %s' % self.user_layout_root)
  157.         elif os.path.exists('/usr/bin/thunar'):
  158.             os.system('thunar %s' % self.user_layout_root)
  159.         else:
  160.             print _('No file manager to open layout folder')
  161.  
  162.     
  163.     def cb_layoutFolderButton_clicked(self, widget):
  164.         self.open_user_layout_dir()
  165.  
  166.     
  167.     def cb_on_personaliseButton_clicked(self, widget):
  168.         dialog = MacroDialog(self.window, _('Enter name for personalised layout'))
  169.         dialog.show_all()
  170.         response = dialog.run()
  171.         if response == gtk.RESPONSE_OK:
  172.             text = dialog.macroEntry.get_text()
  173.             s = OnboardGtk(False)
  174.             utils.create_layout_XML(text, virtkey(), s)
  175.             s.clean()
  176.             self.update_layoutList()
  177.             self.open_user_layout_dir()
  178.         
  179.         dialog.destroy()
  180.  
  181.     
  182.     def cb_scanningCheck_toggled(self, widget):
  183.         self.gconfClient.set_bool('/apps/sok/scanning', widget.get_active())
  184.  
  185.     
  186.     def cb_intervalSpin_value_changed(self, widget):
  187.         self.gconfClient.set_int('/apps/sok/scanning_interval', int(widget.get_value() * 1000))
  188.  
  189.     
  190.     def cb_closeButton_clicked(self, widget):
  191.         self.window.destroy()
  192.  
  193.     
  194.     def update_layoutList(self):
  195.         self.layoutList = gtk.ListStore(str, str)
  196.         self.layoutView.set_model(self.layoutList)
  197.         self.get_soks(os.path.join(self.SOK_INSTALL_DIR, 'layouts'))
  198.         self.get_soks(self.user_layout_root)
  199.  
  200.     
  201.     def cb_selected_layout_changed(self):
  202.         self.get_soks(self.user_layout_root)
  203.  
  204.     
  205.     def cb_macroList_drag_drop(self, widget, event, thing1, thing2, thing3):
  206.         gobject.idle_add(self.macroList_changed)
  207.  
  208.     
  209.     def add_macro(self, event):
  210.         dialog = MacroDialog(self.window, _('Enter text for snippet'))
  211.         dialog.show_all()
  212.         response = dialog.run()
  213.         if response == gtk.RESPONSE_OK:
  214.             text = dialog.macroEntry.get_text()
  215.             l = self.gconfClient.get_list('/apps/sok/macros', gconf.VALUE_STRING)
  216.             if self.macroNumbers:
  217.                 if len(l) <= self.macroNumbers[-1] + 1:
  218.                     l.append(text)
  219.                 else:
  220.                     l[self.macroNumbers[-1] + 1] = text
  221.             else:
  222.                 l.append(text)
  223.             self.gconfClient.set_list('/apps/sok/macros', gconf.VALUE_STRING, l)
  224.         
  225.         dialog.destroy()
  226.         self.on_macros_changed()
  227.  
  228.     
  229.     def add_sok(self, event):
  230.         chooser = gtk.FileChooserDialog(title = None, action = gtk.FILE_CHOOSER_ACTION_OPEN, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  231.         filterer = gtk.FileFilter()
  232.         filterer.add_pattern('*.sok')
  233.         chooser.add_filter(filterer)
  234.         response = chooser.run()
  235.         if response == gtk.RESPONSE_OK:
  236.             filename = chooser.get_filename()
  237.             f = open(filename)
  238.             sokdoc = minidom.parse(f).documentElement
  239.             for p in sokdoc.getElementsByTagName('pane'):
  240.                 fn = p.attributes['filename'].value
  241.                 shutil.copyfile('%s/%s' % (os.path.dirname(filename), fn), '%s%s' % (self.user_layout_root, fn))
  242.             
  243.             shutil.copyfile(filename, '%s%s' % (self.user_layout_root, os.path.basename(filename)))
  244.             self.update_layoutList()
  245.         
  246.         chooser.destroy()
  247.  
  248.     
  249.     def cb_removeButton_clicked(self, event):
  250.         filename = self.layoutList.get_value(self.layoutView.get_selection().get_selected()[1], 1)
  251.         f = open(filename)
  252.         sokdoc = minidom.parse(f).documentElement
  253.         f.close()
  254.         os.remove(filename)
  255.         for p in sokdoc.getElementsByTagName('pane'):
  256.             os.remove('%s/%s' % (os.path.dirname(filename), p.attributes['filename'].value))
  257.         
  258.         self.gconfClient.set_string('/apps/sok/layout_filename', '')
  259.         self.update_layoutList()
  260.  
  261.     
  262.     def get_soks(self, path):
  263.         files = os.listdir(path)
  264.         soks = []
  265.         for f in files:
  266.             if f[-4:] == '.sok':
  267.                 filename = '%s/%s' % (path, f)
  268.                 file_object = open(filename)
  269.                 
  270.                 try:
  271.                     sokdoc = minidom.parse(file_object).documentElement
  272.                     if os.access(filename, os.W_OK):
  273.                         it = self.layoutList.append(('<i>%s</i>' % sokdoc.attributes['id'].value, filename))
  274.                     else:
  275.                         it = self.layoutList.append((sokdoc.attributes['id'].value, filename))
  276.                     if filename == self.gconfClient.get_string('/apps/sok/layout_filename'):
  277.                         self.layoutView.get_selection().select_iter(it)
  278.                 except ExpatError:
  279.                     strerror = None
  280.                     print 'XML in %s %s' % (filename, strerror)
  281.                 except KeyError:
  282.                     strerror = None
  283.                     print 'key %s required in %s' % (strerror, filename)
  284.  
  285.                 file_object.close()
  286.                 continue
  287.         
  288.  
  289.     
  290.     def find_soks(self, path):
  291.         files = os.listdir(path)
  292.         soks = []
  293.         for f in files:
  294.             if f[-4:] == '.sok':
  295.                 soks.append(f)
  296.                 continue
  297.         
  298.         return soks
  299.  
  300.     
  301.     def do_change_layout(self, widget, event):
  302.         filename = self.layoutList.get_value(widget.get_selection().get_selected()[1], 1)
  303.         self.gconfClient.set_string('/apps/sok/layout_filename', filename)
  304.  
  305.  
  306.  
  307. class MacroDialog(gtk.MessageDialog):
  308.     
  309.     def __init__(self, parent, message):
  310.         gtk.MessageDialog.__init__(self, parent, gtk.MESSAGE_QUESTION)
  311.         self.add_buttons(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
  312.         self.macroEntry = gtk.Entry()
  313.         self.macroEntry.connect('activate', self.cb_macroEntry_activated)
  314.         self.vbox.pack_end(self.macroEntry)
  315.         self.set_markup(message)
  316.  
  317.     
  318.     def cb_macroEntry_activated(self, event):
  319.         self.response(gtk.RESPONSE_OK)
  320.  
  321.  
  322. if __name__ == '__main__':
  323.     s = Settings(True)
  324.  
  325.